Given the head of a singly linked list, reverse the list, and return the reversed list.
給定一個單鏈表的頭節點,請反轉該鏈表後並回傳反轉後的單鏈表。
本來想說直接挑戰 92.Reverse Linked List II,結果發現根本越級打怪,馬步還沒練好就想要飛簷走壁,只好先回頭寫基本題。
步驟
當前節點為current、當前節點的前一個節點為prev,前一節點prev為null,如下圖
利用while loop進行每一個指針的反轉,條件是只要當前節點不是null就進行反轉操作
第一步、因為一旦反轉指針,當前節點的下一個節點就會遺失記錄(因為會變成沒有節點指向它,沒有人知道它在哪,所以要先把它(next)的位置存起來,可以從下圖看到灰色虛線箭號就是反轉後前的指針方向)
第二步、反轉指針,把原本指向next的指針,指向prev,從上圖可以看到紅色箭號就是反轉後的指針
第三步、反轉指針完成後,要接著移動下一個指針,但是在移動前,我們要先更新所有current、prev、next的相對位置。原本prev會變成新的current,原本的current會變成新的next(其實就是三個一起往linked list的尾端移動,如下圖)
重複以上步驟
全部指針反轉完成後,prev會在linked list(鏈表)的頭節點,這時回傳prev,如下圖
var reverseList = function(head) {
let prev = null;
let current = head;
while (current) {
let next = current.next; // 暫存當前節點的下一個節點
current.next = prev; // 將當前節點的指針指向前一個節點
prev = current; // 更新 prev 為當前節點
current = next; // 移動到下一個節點
}
return prev; // 回傳反轉後的新頭節點
};